Learn Next.js チュートリアルのサインアウトボタンで AWS Amplify のサインアウト機能を実行する
いわさです。
最近 AWS Amplify を使って Web アプリケーションを作成しているのですが、使ってもらっている同僚から「サインアウト機能がほしい」という指摘をもらいました。
Next.js のダッシュボードテンプレートをベースに作成しており、元々はサインアウトボタンがサイドメニューに存在していたのですが、認証あるいはクッキーが関連するだろうということで Amplify での実装をとりあえず後回しにしていました。
ただ、Amplify のサインアウト機能は非常に簡単に実装することが出来ます。
Amplify UI を使ってサインイン/サインアップ画面を実装することが多いと思いますが、その場合は次のように Authenticator から取得出来る sighOut を使うことも出来ます。
ただ、今回のサンプルだとサイドバーを実装しコンポーネントも分割されていたため同じように実装すべきか悩みました。
sighOut API
Gen1 も Gen2 も同じなのですが、aws-amplify/auth
のsighOut
を使うことが出来ます。
どこからでも呼び出すことができ、さらにオプションでグローバルサインアウトを実行することも出来ます。
Cognito のグローバルサインアウトの場合はユーザーに発行した ID トークン、アクセストークン、リフレッシュトークンを無効化します。
サインアウトボタンを設置して、クリック時に sighOut を実行するようにします。
import Image from "next/image"
import NavLinks from '@/app/ui/dashboard/nav-links';
import { ArrowRightStartOnRectangleIcon } from '@heroicons/react/24/outline';
import { signOut } from "aws-amplify/auth"
export default function SideNav() {
async function handleSighOut() {
await signOut();
}
return (
<div className="flex h-full flex-col px-3 py-4 md:px-2">
<Image src="/logo_black_600.png" width={400} height={200} alt="logo_black_600.png" />
<div className="flex grow flex-row justify-between space-x-2 md:flex-col md:space-x-0 md:space-y-2">
<NavLinks />
<div className="hidden h-auto w-full grow rounded-md bg-gray-50 md:block"></div>
<form>
<button
className="flex h-[48px] w-full grow items-center justify-center gap-2 rounded-md bg-gray-50 p-3 text-sm font-medium hover:bg-sky-100 hover:text-blue-600 md:flex-none md:justify-start md:p-2 md:px-3"
onClick={handleSighOut}>
<ArrowRightStartOnRectangleIcon className="w-6" />
<div className="hidden md:block">Sign Out</div>
</button>
</form>
</div>
</div>
);
}
アイコンはサンプルで使っていた heroicons から適当なものを探してきました。
サイドメニューにサインアウトボタンを設置出来ました。
ボタンを押してみるとサインアウトされ、サインイン画面が表示されるようになりました。良さそうです。
さいごに
本日は Learn Next.js チュートリアルのサインアウトボタンで AWS Amplify のサインアウト機能を実行してみました。
Auth(Cognito)のグローバルサインアウトが簡単に呼び出せて良いですね。
Amplify を使っている方はおそらく当たり前のように使っていそうですが、以外に Atuhenticator を使った利用が多かったので最初少し悩みました。